#ifndef RESEAU_H_INCLUDED
#define RESEAU_H_INCLUDED

#include "enet/enet.h"
#include <string>
#include <map>
#include "Logger.h"


typedef unsigned int DPID;

enum MessageReseauType
{
	TYPE_AJOUTERJOUEUR,
	TYPE_RETIRERJOUEUR,
	TYPE_BIENVENUE,
	TYPE_CUSTOM
};

struct MessageReseau
{
	MessageReseauType typeMessage;	
};

struct MessageBienvenue : MessageReseau
{
	DPID tonId;

	MessageBienvenue() 
	{
		typeMessage = TYPE_BIENVENUE;
	}
};

struct MessageAjouterJoueur : MessageReseau
{
	DPID id;
	char nom[20];

	MessageAjouterJoueur()
	{
		typeMessage = TYPE_AJOUTERJOUEUR;
	}
};

struct MessageRetirerJoueur : MessageReseau
{
	DPID id;

	MessageRetirerJoueur()
	{
		typeMessage = TYPE_RETIRERJOUEUR;
	}
};

struct ClientInfos
{
	ENetPeer* serveurPeer;
	ClientInfos() : serveurPeer(NULL) {}	
};

struct ServeurClientBucket
{
	ENetPeer* mPeer;
	std::string mNom;
	
	ServeurClientBucket(ENetPeer* peer, std::string nom) : mPeer(peer), mNom(nom){}
	ServeurClientBucket() {}
};

struct ServeurInfos
{
	DPID compteurClients;
	std::map<int, ServeurClientBucket> clientMap;
	
	ServeurInfos() : compteurClients(1) {}
	
	int enregistrerClientSuivant(ENetPeer* peer, std::string nom);
};

enum ClientServeurMode
{
	CSM_CLIENT, CSM_SERVEUR, CSM_AUCUN
};

class Reseau
{
	ENetHost* localEnetHost;	
	ClientInfos* clientInfos;
	ServeurInfos* serveurInfos;
	ClientServeurMode modeClientServeur;
  

public:
	Reseau();

	~Reseau();
	
	bool creerPartie();
	
	bool joindrePartie();

	MessageReseau* recupererMessageSuivant(DPID* idFrom);

	void envoyerMessageGeneral(MessageReseau* message, size_t size);

	void envoyerMessageServeur(MessageReseau* message, size_t size);
};

#endif